package juegos.memorizar;

import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.InputStream;

import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.Timer;
import javax.swing.event.EventListenerList;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;

import juegos.memorizar.generados.JuegoMemorizar;
import juegos.memorizar.generados.ObjectFactory;
import juegos.memorizar.generados.Objeto;
import juegos.utlidades.ImageCache;

@SuppressWarnings("serial")
public class PanelMemorizar extends JPanel {

	// Ruta imagen
	public static String IMG = "src/juegos/memorizar/imagenes/";
	// Ruta xml
	public static String XML = "juegos/memorizar/xml/";
	
	// Estados para los eventos del juego
	private int estadoActual = LABORATORIO;
	public static int LABORATORIO = 0;
	public static int VIGILANCIA = 1;
	public static int PINTAR_OBJETOS = 2;
	public static int INICIO_PREGUNTAS = 3;
	public static int PREGUNTAS = 4;

	// Auxiliares
	private Timer timer;
	private static int i = 0;
	private static int j = 0;
	private String[] fondos = { "lab.jpg", "vigilancia.jpg", "arbol.jpg" };

	// Clase encargada de tomar todos los datos del xml
	static JuegoMemorizar juegoMemorizar;

	// Objeto actual
	private Objeto objActual = null;

	// Componentes
	private JTextField txtEntrada;
	private JButton btnResponder;
	private EventListenerList eventListenerList = new EventListenerList();

	public PanelMemorizar() {
		cargarXML();
		cargarEventos();
		objActual = juegoMemorizar.getObjeto().get(j);
	}

	public void cargarEventos() {

		timer = new Timer(3000, new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				estadoActual = INICIO_PREGUNTAS;
				repaint();
			}
		});

		addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				switch (estadoActual) {
				case 0:
					estadoActual = VIGILANCIA;
					i++;
					repaint();
					break;
				case 1:
					estadoActual = PINTAR_OBJETOS;
					repaint();
					i++;
					mensaje();
					timer.start();
					break;
				}
			}
		});

	}

	protected void mensaje() {
		JOptionPane
				.showMessageDialog(this,
						"Memoriza los objetos en el escenario, tienes tiempo limitado, apresurate");
	}

	protected void iniciarPreguntas(Graphics2D g2) {
		g2.drawImage(ImageCache.getInstance().getImage(objActual.getDialogo()),
				200, 100,
				ImageCache.getInstance().getImage(objActual.getDialogo())
						.getWidth(),
				ImageCache.getInstance().getImage(objActual.getDialogo())
						.getHeight(), this);
		txtEntrada = new JTextField("", 20);
		txtEntrada.setBounds(getWidth() / 2 - 200, getHeight() / 2 + 200, 200,
				30);
		add(txtEntrada);

		btnResponder = new JButton("Responder");
		btnResponder.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				btnResponderAccion();
			}
		});
		btnResponder.setBounds(getWidth() / 2 + 30, getHeight() / 2 + 200, 150,
				30);
		add(btnResponder);

	}

	protected void btnResponderAccion() {
		if (txtEntrada.getText().equalsIgnoreCase(objActual.getNombre())) {
			j++;
			if (j == juegoMemorizar.getObjeto().size()) {
				remove(btnResponder);
				remove(txtEntrada);
				JOptionPane.showMessageDialog(this, "Ganaste! !",
						"�Felicidades!", JOptionPane.INFORMATION_MESSAGE);
				getGraphics()
						.drawImage(
								ImageCache
										.getInstance()
										.getImage(
												IMG + "dialogofinal.jpg"),
								0,
								0,
								ImageCache
										.getInstance()
										.getImage(
												IMG + "dialogofinal.jpg")
										.getWidth(),
								ImageCache
										.getInstance()
										.getImage(
												IMG + "dialogofinal.jpg")
										.getHeight(), this);
				try {
					Thread.sleep(3000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				fireActionEvent(new ActionEvent(this, 0, "PanelPracticaInstru"));

			} else {
				objActual = juegoMemorizar.getObjeto().get(j);
				getGraphics().drawImage(
						ImageCache.getInstance().getImage(
								objActual.getDialogo()),
						200,
						100,
						ImageCache.getInstance()
								.getImage(objActual.getDialogo()).getWidth(),
						ImageCache.getInstance()
								.getImage(objActual.getDialogo()).getHeight(),
						this);
				txtEntrada.setText(null);
				txtEntrada.requestFocus();
			}

		} else {
			JOptionPane.showMessageDialog(this,
					"Respuesta incorrecta verifique su respuesta!", "Error!",
					JOptionPane.ERROR_MESSAGE);
			txtEntrada.setText(null);
			txtEntrada.requestFocus();
		}
	}

	private void cargarXML() {
		InputStream is = ClassLoader
				.getSystemResourceAsStream(XML + "Objetos.xml");
		try {
			JAXBContext jc = JAXBContext.newInstance(ObjectFactory.class
					.getPackage().getName());
			Unmarshaller unmarshaller = jc.createUnmarshaller();
			juegoMemorizar = (JuegoMemorizar) unmarshaller.unmarshal(is);
		} catch (JAXBException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void paintBorder(Graphics g) {
		super.paintComponent(g);
		Graphics2D g2 = (Graphics2D) g;
		if (estadoActual != PREGUNTAS) {
			switch (i) {
			case 0:
				g2.setColor(Color.BLACK);
				g2.fillRect(0, 0, getWidth(), getHeight());
				g2.drawImage(
						ImageCache.getInstance().getImage(
								IMG + fondos[i]),
						110,
						0,
						ImageCache.getInstance()
								.getImage(IMG + fondos[i])
								.getWidth(),
						ImageCache.getInstance()
								.getImage(IMG + fondos[i])
								.getHeight(), this);
				break;

			case 1:
				g2.setColor(Color.BLACK);
				g2.fillRect(0, 0, getWidth(), getHeight());
				g2.drawImage(
						ImageCache.getInstance().getImage(
								IMG + fondos[i]),
						170,
						0,
						ImageCache.getInstance()
								.getImage(IMG + fondos[i])
								.getWidth(),
						ImageCache.getInstance()
								.getImage(IMG + fondos[i])
								.getHeight(), this);
				break;
			case 2:
				g2.setColor(Color.BLACK);
				g2.fillRect(0, 0, getWidth(), getHeight());
				g2.drawImage(
						ImageCache.getInstance().getImage(
								IMG + fondos[i]),
						110,
						0,
						ImageCache.getInstance()
								.getImage(IMG + fondos[i])
								.getWidth(),
						ImageCache.getInstance()
								.getImage(IMG + fondos[i])
								.getHeight(), this);
				break;
			}
			
			if (estadoActual == PINTAR_OBJETOS) {
				cargarImagenes(g2);
			}

			if (estadoActual == INICIO_PREGUNTAS) {
				estadoActual = PREGUNTAS;
				iniciarPreguntas(g2);
				timer.stop();
			}

		}
	}

	private void cargarImagenes(Graphics2D g2) {
		for (Objeto obj : juegoMemorizar.getObjeto()) {
			int x = (int) (Math.random() * 300 + 150);
			int y = (int) (Math.random() * 300 + 50);
			g2.drawImage(ImageCache.getInstance().getImage(obj.getImagen()), x,
					y, ImageCache.getInstance().getImage(obj.getImagen())
							.getWidth(),
					ImageCache.getInstance().getImage(obj.getImagen())
							.getHeight(), this);
		}
	}

	public void addActionListener(ActionListener listener) {
		eventListenerList.add(ActionListener.class, listener);
	}

	public void removeActionListener(ActionListener listener) {
		eventListenerList.remove(ActionListener.class, listener);
	}

	public ActionListener[] getActionListeners() {
		return eventListenerList.getListeners(ActionListener.class);
	}

	private void fireActionEvent(ActionEvent evt) {
		ActionListener[] actionListeners = getActionListeners();

		for (ActionListener actionListener : actionListeners) {
			actionListener.actionPerformed(evt);
		}
	}
}
